#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
-------------------------------------------------------------------------------
@NAME          : dodir.py
@TIME          : 2025/01/31 16:30:10
@AUTHOR        : chenlip
@VERSION       : 0.0.1
@DESCRIPTION   : 本地文件操作工具
-------------------------------------------------------------------------------
'''

import os
import platform
import win32file
import win32con
import pywintypes
from datetime import datetime

from app.common.logutil import log as logger
from app.common.utils import Utils as ut

class FileSetter:
    """文件时间修改器类"""
    
    def __init__(self):
        """初始化类"""
        self.system = platform.system()

    @staticmethod
    def get_os_type() -> str:
        """获取操作系统类型"""
        return platform.system()
    
    @staticmethod
    def modify_file_time_windows(file_path:str, create_time: str) -> bool:
        """修改Windows系统下文件的创建时间和修改时间"""
        handle = None
        try:
            # 解析时间字符串
            create_datetime = ut._parse_time_string(create_time)
            
            # 转换时间格式为PyWin32时间对象
            win_time = pywintypes.Time(create_datetime)
            
            # 获取文件句柄
            handle = win32file.CreateFile(
                file_path,
                win32con.GENERIC_WRITE,
                0,
                None,
                win32con.OPEN_EXISTING,
                win32con.FILE_ATTRIBUTE_NORMAL,
                None
            )
            
            # 修改文件时间
            win32file.SetFileTime(handle, win_time, None, win_time)
            return True

        except ValueError as ve:
            logger.error(f"时间格式错误: {str(ve)}")
            return False
        except WindowsError as we:
            logger.error(f"Windows系统错误: {str(we)}")
            return False
        except Exception as e:
            logger.error(f"未预期的错误: {str(e)}")
            return False
        finally:
            if handle:
                handle.Close()

    @staticmethod
    def modify_file_time_linux(file_path, create_time: str) -> bool:
        """修改Linux系统下文件的创建时间"""
        try:
            # 解析时间字符串
            create_datetime = ut._parse_time_string(create_time)
            
            # 转换时间为时间戳
            timestamp = create_datetime.timestamp()
            
            # 修改文件时间
            os.utime(file_path, (timestamp, timestamp))
            return True

        except ValueError as ve:
            logger.error(f"时间格式错误: {str(ve)}")
            return False
        except OSError as oe:
            logger.error(f"系统操作错误: {str(oe)}")
            return False
        except Exception as e:
            logger.error(f"未预期的错误: {str(e)}")
            return False
    
    @staticmethod
    def set_creation_time(file_path:str, create_time: str) -> bool:
        """根据操作系统类型修改文件创建时间的主函数"""
        try:
            # 验证文件路径
            if not isinstance(file_path, str):
                raise ValueError("file_path必须是字符串")
            
            if not os.path.exists(file_path):
                raise FileNotFoundError("文件不存在")

            if not os.path.isfile(file_path):
                raise ValueError("指定路径不是文件")

            # 根据系统类型调用相应方法
            if FileSetter.get_os_type() == "Windows":
                return FileSetter.modify_file_time_windows(file_path, create_time)
            elif FileSetter.get_os_type() == "Linux":
                return FileSetter.modify_file_time_linux(file_path, create_time)
            else:
                logger.error(f"不支持的操作系统: {FileSetter.get_os_type()}")
                return False

        except (ValueError, FileNotFoundError) as e:
            logger.error(str(e))
            return False
        except Exception as e:
            logger.error(f"修改文件时间时发生错误: {str(e)}")
            return False
        

